clear
clc
close all
 %% 建立模糊控制器
% %整体逻辑是，先导入fuzzymzh.fis文件作为模糊控制器，并进行simulink仿真
% %对模糊控制进行更改时，应当更改fuzzymzh.fis中的一些参数（比如论域）并重新导入
% %又或者说，直接自己新建一个fis文件，加入隶属度函数、规则、论域等等，自己进行更改
% fis = mamfis('Name','fuzzym');%新建一个模糊控制器
% %设定e和ec的范围与隶属度函数
% mfun='gaussmf';%隶属度函数的形式
% fis=addInput(fis,[-6 6],'Name','e','NumMFs',7,'MFType',mfun);
% fis=addInput(fis,[-6 6],'Name','ec','NumMFs',7,'MFType',mfun);
% %plotmf(fis,'input',2);
% %设定Kp、KI、KD的论域与隶属度函数
% fis=addOutput(fis,[80 120],'Name','KP','NumMFs',7,'MFType',mfun);
% fis=addOutput(fis,[8 12],'Name','KI','NumMFs',7,'MFType',mfun);
% fis=addOutput(fis,[8 12],'Name','KD','NumMFs',7,'MFType',mfun);
% %设定模糊控制规则
% input_list=[1 1;1 2;1 3;1 4;1 5;1 6;1 7;
%         2 1;2 2;2 3;2 4;2 5;2 6;2 7;
%         3 1;3 2;3 3;3 4;3 5;3 6;3 7;
%         4 1;4 2;4 3;4 4;4 5;4 6;4 7;
%         5 1;5 2;5 3;5 4;5 5;5 6;5 7;
%         6 1;6 2;6 3;6 4;6 5;6 6;6 7;
%         7 1;7 2;7 3;7 4;7 5;7 6;7 7];
% lianjie = ones(49,2);
% output_list = ones(49,3);
% rulelist=[input_list lianjie output_list];
% fis = addRule(fis,rulelist);
% writeFIS(fis,'myFIS.fis');
%% 将模糊控制器导入simulink
tic
open_system('danji_fuzzy.slx');%打开simulink模型
fuzzymzh = readfis('fuzzymzh.fis');
fuzzymzh.Inputs(1).Range = [-25 25];
fuzzymzh.Inputs(2).Range = [-15 15];
% fuzzymzh.Outputs(1).Range = 0.9014.*(1+0.05.*[-1,1]);
% fuzzymzh.Outputs(2).Range = 0.0921.*(1+0.2.*[-1 1]);
% fuzzymzh.Outputs(3).Range = 0.6991.*(1+0.2.*[-1 1]);
load pop100_1.mat;
x = pop(10).x;
%x = [0.9014,0.0921,0.6991,0.05,0.2,0.2];
fuzzymzh.Outputs(1).Range = x(1).*(1+x(4).*[-1,1]);
fuzzymzh.Outputs(2).Range = x(2).*(1+x(5).*[-1 1]);
fuzzymzh.Outputs(3).Range = x(3).*(1+x(6).*[-1 1]);
range.i1 = fuzzymzh.Inputs(1).Range;
range.i2 = fuzzymzh.Inputs(2).Range;
range.o1 = fuzzymzh.Outputs(1).Range;
range.o2 = fuzzymzh.Outputs(2).Range;
range.o3 = fuzzymzh.Outputs(3).Range;
i1 = linspace(range.i1(1),range.i1(2),7);
i2 = linspace(range.i2(1),range.i2(2),7);
o1 = linspace(range.o1(1),range.o1(2),7);
o2 = linspace(range.o2(1),range.o2(2),7);
o3 = linspace(range.o3(1),range.o3(2),7);
%重新调整隶属度函数的范围
for i=1:7
    fuzzymzh.Inputs(1).mf(i).Parameters = i1(i)+[-diff(range.i1)/6,0,diff(range.i1)/6];
    fuzzymzh.Inputs(2).mf(i).Parameters = i2(i)+[-diff(range.i2)/6,0,diff(range.i2)/6];
    fuzzymzh.Outputs(1).mf(i).Parameters = o1(i)+[-diff(range.o1)/6,0,diff(range.o1)/6];
    fuzzymzh.Outputs(2).mf(i).Parameters = o2(i)+[-diff(range.o2)/6,0,diff(range.o2)/6];
    fuzzymzh.Outputs(3).mf(i).Parameters = o3(i)+[-diff(range.o3)/6,0,diff(range.o3)/6];
end
set_param('danji_fuzzy/fuzzy_controller','FIS','fuzzymzh');%导入

%%
result = sim('danji_fuzzy.slx',[0 50]);%在0~50s之间进行模拟
toc
p = result.ScopeData1.signals.values;%压力
t = result.tout;%时间
set_point=23;%目标压力
%overshoot = (max(p)-set_point)/set_point;%超调量
S = stepinfo(p,t,set_point,'SettlingTimeThreshold',0.01);
stable_time = S.TransientTime;%调整时间 这个毫无疑问是一个优化目标！
it = find(abs(t-stable_time)<0.1);
ave_error = mean(abs(p(it(end):end)-set_point));%稳态误差
peak = S.Peak;
%% respond函数的输出值与上述竟然不一样？？？
file = 'danji_fuzzy';
Range.e = [-25 25];
Range.ec = [-15 15];
y_respond = 1./respond(file,pop(2).x,fuzzymzh,Range);